package com.example.demo1.twd.controller;

import com.example.demo1.twd.annotation.TwdController;
import com.example.demo1.twd.bean.UserPdfExport;
import com.example.demo1.twd.config.PDFUtil;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@TwdController("/pdf")
public class PdfController   {
    @GetMapping("/11")
    public void exportPDFTest2(HttpServletResponse response) throws DocumentException, IOException {
    Document document = new Document(PageSize.A4, 50, 50, 50, 50);
    // 使用PDFWriter进行写文件操作
        ByteArrayOutputStream out = new ByteArrayOutputStream();// 构建字节输出流

        PdfWriter.getInstance(document, out);
        document.open();

    // 中文字体(现在高版本的不支持中文包)
    BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);// 中文、12、正常

    int colNumber = 6;

    // PdfPTable[PdfPTable[PdfPCell[Paragraph]]]
    // 创建有6列的表格
    PdfPTable datatable = new PdfPTable(colNumber);
    // 定义表格的宽度
    int[] cellsWidth = { 1, 1, 1, 1, 1, 1 };
        datatable.setWidths(cellsWidth);// 单元格宽度
    // datatable.setTotalWidth(300f);//表格的总宽度
        datatable.setWidthPercentage(100);// 表格的宽度百分比

        datatable.getDefaultCell().setPadding(2);// 单元格的间隔
        datatable.getDefaultCell().setBorderWidth(0);// 边框宽度
//        datatable.getDefaultCell().setVerticalAlignment(Element.ALIGN_LEFT);
    // 设置表格的底色
        datatable.getDefaultCell().setBackgroundColor(BaseColor.GREEN);
        datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);

    // PdfPTable[PdfPCell[Paragraph]]
    // 添加表头元素
        int a=1;
        for (int i = 0; i < colNumber; i++) {

            if((a=(a^1)) == 0)
        datatable.addCell(new Paragraph("tableHeader[i]", fontChinese));
            else
                datatable.addCell(new Paragraph("tableHeader[i]", fontChinese));

        }
    // 添加表格的内容
        for (int i = 0; i < colNumber; i++) {
        datatable.addCell(new Paragraph("tableCont[i]", fontChinese));
    }

    // 空白表格
        for (int i = 0; i < colNumber; i++) {
        PdfPCell cell = new PdfPCell(new Paragraph(""));
        cell.setFixedHeight(10);// 单元格高度
        datatable.addCell(cell);
    }
        datatable.setSpacingAfter(40f);// 设置表格下面空白行
        document.add(datatable);// 把表格加入文档

    // 跨行跨列表格
    PdfPTable table = new PdfPTable(3); // 3列表格
    PdfPCell cell; // 单元格
    cell = new PdfPCell(new Phrase("跨3列", fontChinese));
        cell.setColspan(3);// 跨3列
        table.addCell(cell);

    cell = new PdfPCell(new Phrase("跨2行", fontChinese));
        cell.setRowspan(2);// 跨2行
        table.addCell(cell);
        table.addCell("row 1; cell 1");
        table.addCell("row 1; cell 2");
        table.addCell("row 2; cell 1");
        table.addCell("row 2; cell 2");

        document.add(table);

    // 表格的嵌套
    PdfPTable tableFather = new PdfPTable(4);
        tableFather.setSpacingBefore(20f);// 设置表格上面空白行
    // 1行2列
    PdfPTable nested1 = new PdfPTable(2);
        nested1.addCell("1.1");
        nested1.addCell("1.2");
    // 2行1列
    PdfPTable nested2 = new PdfPTable(1);
        nested2.addCell("2.1");
        nested2.addCell("2.2");

    // 将表格插入到指定位置
        for (int k = 0; k < 12; ++k) {
        if (k == 1) {
            tableFather.addCell(nested1);
        } else if (k == 6) {
            tableFather.addCell(nested2);
        } else {
            tableFather.addCell("cell " + k);
        }
    }
        document.add(tableFather);

        document.close();
        OutputStream os = response.getOutputStream();
        // 设置文件大小
        // response.setContentLength((int) f.length());
        os.write(out.toByteArray());
}
    @GetMapping("/")
    public void exportPDFTest(HttpServletResponse response) {
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode(System.currentTimeMillis()+"", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();// 构建字节输出流
            // 实例化文档对象
            Document document = new Document(PageSize.A4, 10, 10, 10, 10);
            // 创建 PdfWriter 对象 文件的输出路径+文件的实际名称
            PdfWriter writer = PdfWriter.getInstance(document, baos);// 设置分页
            // writer.setPageEvent(new PDFMaker());
            document.open();// 打开文档
            // 创建一个段落
            document.add(PDFUtil.getPDFParagraph("测试PDF标题", 0, 20, Element.ALIGN_CENTER, 1));
            // 标题
            String[] title = {"ID", "姓名", "年龄", "生日", "出生地", "身份证", "住址"};
            // 列宽
            int tableWidth[] = {10, 15, 15, 15, 15, 15, 15};
            Map<String, Object> map = new HashMap<>();
            //自定义数据列
            List<UserPdfExport> userPdfExports = new ArrayList<>();
            UserPdfExport userPdfExport = new UserPdfExport();
            userPdfExport.setId(1);
            userPdfExport.setName("zhang");
            userPdfExport.setAge(12);
            userPdfExport.setBirthday("232");
            userPdfExport.setCsd("住址住址住址住址住址住址住址住址");
            userPdfExport.setIdCard("住址住址住址");
            userPdfExport.setAddress("住址住址住址住址阿斯顿发送到发送到发送到发送到发送到发送到阿斯顿发送到阿斯顿发水电费阿斯顿发送到阿斯蒂芬阿萨德");
            userPdfExports.add(userPdfExport);
            map.put("ksList", userPdfExports);
            if (map != null) {

                if (map.get("ksList") != null) {
                    List list = (List<UserPdfExport>) map.get("ksList");
                    // 获取PDFTable
                    PdfPTable table = PDFUtil.getPDFTable(tableWidth, title, list, 0);
                    // 添加进文档
                    document.add(table);
                }

            }
            // 关闭文档
            if (document != null) {
                document.close();
            }
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            OutputStream os = response.getOutputStream();
            // 设置文件大小
            // response.setContentLength((int) f.length());
            os.write(baos.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @GetMapping("/PDFTest2")
    public void exportTestPDF(HttpServletResponse response) throws IOException {
        Resource resource = new ClassPathResource("");

        String path = resource.getFile().getAbsolutePath();
        path=path+"/pdf/MIXSAFETY1.pdf";
        OutputStream out = null;
        ByteArrayOutputStream bos = null;
        PdfStamper stamper = null;
        PdfReader reader = null;
        Map<String,String> dataMap=new HashMap<>();
        dataMap.put("文本域0.0.0","2");
        dataMap.put("文本域0.0.1","3");
        dataMap.put("文本域0.1.0","4");
        dataMap.put("文本域0.1.1","7");
        try {
            out = response.getOutputStream();
            // 读取PDF模板表单
            reader = new PdfReader(path);
            // 字节数组流，用来缓存文件流
            bos = new ByteArrayOutputStream();
            // 根据模板表单生成一个新的PDF
            stamper = new PdfStamper(reader, bos);
            // 获取新生成的PDF表单
            AcroFields form = stamper.getAcroFields();
            // 给表单生成中文字体，这里采用系统字体，不设置的话，中文显示会有问题
            BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            form.addSubstitutionFont(font);
            // 遍历data，给pdf表单赋值
            for(String key : dataMap.keySet()){
                // 图片要单独处理
                if("img".equals(key)){
                    form.addSubstitutionFont(BaseFont.createFont("STSong-Light",
                            "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));
                    //通过域名获取所在页和坐标，左下角为起点
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    String studentImage = dataMap.get(key);
                    //根据路径或Url读取图片
                    Image image = Image.getInstance(studentImage);

                    //获取图片页面
                    PdfContentByte under = stamper.getOverContent(pageNo);
                    //图片大小自适应
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    //添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                } else {
                    // 设置普通文本数据
                    form.setField(key, dataMap.get(key));
                }
            }
            // 表明该PDF不可修改
            stamper.setFormFlattening(true);
            // 关闭资源
            stamper.close();
            // 将ByteArray字节数组中的流输出到out中（即输出到浏览器）
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
            System.out.println("*****************************PDF导出成功*********************************");
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
                if (reader != null) {
                    reader.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    }


